package com.cloudcross.ssp.base.dao;

import java.util.List;

import org.bson.Document;
import org.bson.conversions.Bson;

import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;

/**
 * mongoDB操作接口,驱动基于3.0及以上
 * @author 杜武强
 *
 */
public interface MongoDBDao {
    /**
     * 得到指定数据库
     * @param dbName
     * @return      
     */
    MongoDatabase getDataBase(String dbName);
	
	/**
	 * 得到指定数据库中的指定的集合
	 * @param dbName
	 * @param dbCollection
	 * @return
	 */
    MongoCollection<Document> getCollection(String dbName, String dbCollection);
	
    /**
     * 向指定的数据库和数据集合插入一个文档
     * @param dbName
     * @param dbCollection
     * @param document
     */
    void insertOne(String dbName, String dbCollection, Document document);
    
    /**
     * 向指定数据库和数据集合插入多个文档
     * @param dbName
     * @param dbCollection
     * @param documents
     */
    void insertMany(String dbName, String dbCollection, List<Document> documents);
    
    /**
     * 更新指定数据库的集合的一个文档
     * @param dbName
     * @param dbCollection
     * @param filterDocument 要更新文档的条件，根据你给的这个文档条件找到要跟新的文档
     * @param newDocument 要更新的文档，将你给的文档重新给旧的文档设值
     */
    void updateOne(String dbName, String dbCollection, Bson filterDocument, Document newDocument);
    
    
    /**
     * 更新指定数据库的集合中符合条件的多个文档
     * @param dbName
     * @param dbCollection
     * @param filterDocument
     * @param newDocument
     * @return
     */
    void updateMany(String dbName, String dbCollection, Bson filterDocument, Document newDocument);

    /**
     * 替换指定数据库中指定集合的文档
     * @param dbName
     * @param dbCollection
     * @param filterDocument 筛选条件
     * @param newDocument 新的文档
     * @return
     */
    void replaceOne(String dbName, String dbCollection, Bson filterDocument, Document newDocument);
    
    
    /**
     * 在给定的数据库和集合中，删除于条件匹配的所有文档
     * @param dbName
     * @param dbCollection
     * @param filterDocument 当文档new出来后，里面的值都没有时表示删除该集合所有的文档
     * @return
     */
    void delete(String dbName, String dbCollection, Bson filterDocument);
    
    /**
     * 在指定数据指定集合中按条件进行查询
     * @param dbName
     * @param dbCollection
     * @param filterDocument 如果过滤条件是空则查询的是所有的
     * @return
     */
    FindIterable<Document> find(String dbName, String dbCollection, Bson filterDocument);
    
    /**
     * 在指定数据指定集合中按条件进行查询，只返回一条
     * @param dbName
     * @param dbCollection
     * @param filterDocument
     * @return
     */
    Document findOne(String dbName, String dbCollection, Bson filterDocument);
    
    /**
     * 计数指定数据库中指定集合的所有文档的个数
     * @param dbName
     * @param dbCollection
     * @return
     */
    long count(String dbName, String dbCollection);
    
    /**
     * 按给定过滤器计数指定数据库中指定集合的文档的个数
     * @param dbName
     * @param dbCollection
     * @param filter
     * @return
     */
    long count(String dbName, String dbCollection, Bson filter);
    
    
    /**
     * 在指定数据库指定集合上创建索引
     * @param dbName
     * @param dbCollection
     * @param keys
     * @return
     */
    void creatIndex(String dbName, String dbCollection, Bson keys);
    
    /**
     * 从指定的数据库中指定的集合中删除掉给定的索引的名称的索引
     * @param dbName
     * @param dbCollection
     * @param index 要删除的索引的名称
     * @return
     */
    void dropIndex(String dbName, String dbCollection, String index);
}